//package com.chen.back.config;
//
//import org.springframework.amqp.rabbit.connection.ConnectionFactory;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
//import org.springframework.amqp.support.converter.MessageConverter;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.retry.RetryCallback;
//import org.springframework.retry.RetryContext;
//import org.springframework.retry.RetryListener;
//import org.springframework.retry.backoff.ExponentialBackOffPolicy;
//import org.springframework.retry.policy.SimpleRetryPolicy;
//import org.springframework.retry.support.RetryTemplate;
//import org.springframework.stereotype.Controller;
//
///**
// * @author chen
// * @date @{DATE} -22:40
// **/
////@Configuration
//public class RabbitMqConfig {
//    @Autowired
//    private ConnectionFactory rabbitConnectionFactory;
//
//    //@Bean  缓存连接池
//    //public CachingConnectionFactory rabbitConnectionFactory
//
//    @Autowired
//    private RabbitProperties properties;
//
//    @Bean
//    public RabbitTemplate rabbitTemplate(){
//        RabbitTemplate rabbitTemplate=new RabbitTemplate(rabbitConnectionFactory);
//        //默认是用jdk序列化
//        //数据转换为json存入消息队列，方便可视化界面查看消息数据
//        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
//        //设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
//        rabbitTemplate.setMandatory(true);
//        //此处设置重试template后，会再生产者发送消息的时候，调用该template中的调用链
//        rabbitTemplate.setRetryTemplate(rabbitRetryTemplate());
//        //CorrelationData correlationData, boolean b, String s
//        rabbitTemplate.setConfirmCallback(
//                (correlationData, b, s) -> {
//                    System.out.println("ConfirmCallback     "+"相关数据："+  correlationData);
//                    System.out.println("ConfirmCallback     "+"确认情况："+b);
//                    System.out.println("ConfirmCallback     "+"原因："+s);
//                });
//        //Message message, int i, String s, String s1, String s2
//        rabbitTemplate.setReturnCallback((message, i, s, s1, s2) -> {
//            System.out.println("ReturnCallback：     "+"消息："+message);
//            System.out.println("ReturnCallback：     "+"回应码："+i);
//            System.out.println("ReturnCallback：     "+"回应消息："+s);
//            System.out.println("ReturnCallback：     "+"交换机："+s1);
//            System.out.println("ReturnCallback：     "+"路由键："+s2);
//        });
//
//        return rabbitTemplate;
//    }
//    //重试的Template
//    @Bean
//    public RetryTemplate rabbitRetryTemplate() {
//        RetryTemplate retryTemplate = new RetryTemplate();
//        // 设置监听  调用重试处理过程
//        retryTemplate.registerListener(new RetryListener() {
//            @Override
//            public <T, E extends Throwable> boolean open(RetryContext retryContext, RetryCallback<T, E> retryCallback) {
//                // 执行之前调用 （返回false时会终止执行）
//                return true;
//            }
//
//            @Override
//            public <T, E extends Throwable> void close(RetryContext retryContext, RetryCallback<T, E> retryCallback, Throwable throwable) {
//                // 重试结束的时候调用 （最后一次重试 ）
//                System.out.println("---------------最后一次调用");
//
//                return ;
//            }
//            @Override
//            public <T, E extends Throwable> void onError(RetryContext retryContext, RetryCallback<T, E> retryCallback, Throwable throwable) {
//                //  异常 都会调用
//                System.err.println("-----第{}次调用"+retryContext.getRetryCount());
//            }
//        });
//        retryTemplate.setBackOffPolicy(backOffPolicyByProperties());
//        retryTemplate.setRetryPolicy(retryPolicyByProperties());
//        return retryTemplate;
//    }
//
//    @Bean(name = "backOffPolicyByProperties")
//    public ExponentialBackOffPolicy backOffPolicyByProperties() {
//        ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
//        long maxInterval = properties.getListener().getSimple().getRetry().getMaxInterval().getSeconds();
//        long initialInterval = properties.getListener().getSimple().getRetry().getInitialInterval().getSeconds();
//        double multiplier = properties.getListener().getSimple().getRetry().getMultiplier();
//        // 重试间隔
//        backOffPolicy.setInitialInterval(initialInterval * 1000);
//        // 重试最大间隔
//        backOffPolicy.setMaxInterval(maxInterval * 1000);
//        // 重试间隔乘法策略
//        backOffPolicy.setMultiplier(multiplier);
//        return backOffPolicy;
//    }
//
//    @Bean
//    public SimpleRetryPolicy retryPolicyByProperties() {
//        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
//        int maxAttempts = properties.getListener().getSimple().getRetry().getMaxAttempts();
//        retryPolicy.setMaxAttempts(maxAttempts);
//        return retryPolicy;
//    }
//
//
//}
